#!/usr/bin/python
import random
import sys
import string 
import os
import time
import copy

class JuegoEstado:
	def __init__(self,numeros):
		self.numeros = numeros
		self.puntos = [0,0]
		self.actual = 0
		self.turno = 0
		self.turnoCount = 0

	def cambiarJugadorActual(self,actual=None):
		if actual:
			self.actual = actual
		else:
			self.actual = (self.actual+1)%2

	def addPuntos(self,p):
		self.puntos[self.actual] += p

	def getPuntos(self):
		return self.puntos[self.actual]

	def getPuntosOtro(self):
		return self.puntos[(self.actual+1)%2]

	def pasarTurno(self):
		self.turno = (self.turno+1)%2

	def finalizo(self):
		return len(self.numeros) == 0
	def printEstado(self):
		pad = ''
		if (self.actual != 0):
			pad = string.join(['\t' for i in range(10)])
		print "%s%s->>>        A:%s T:%s P %s@%s N: %s" % (pad,id(self),self.actual,\
			self.turno,\
			self.puntos[0],\
			self.puntos[1],\
			str(self.numeros))

def jugarRecursivo(estado):
	if estado.turno != estado.actual:
		#cambio cual es el jugador actual y lo dejo jugar
		estado.cambiarJugadorActual()
		estado = jugarRecursivo(estado)
		#puedo jugar si sigue habiendo fichas
		if not estado.finalizo():
			estado = jugarRecursivo(estado)
		return estado

	length = len(estado.numeros)	
	if length == 1:
		estado.addPuntos(sum(estado.numeros))
		estado.numeros = []
		return estado

	maxdiff = None
	maxdiffestado = estado
	miJugador = estado.actual
	#print "entro %s " % length
	#estado.printEstado()
	for i in range(1,length):
		#
		estadoizq = copy.deepcopy(estado)
		estadoizq.addPuntos(sum(estado.numeros[:i]))
		estadoizq.numeros = estado.numeros[i:]
		estadoizq.pasarTurno()
		estadoizq = jugarRecursivo(estadoizq)
		#
		estadoder = copy.deepcopy(estado)
		estadoder.addPuntos(sum(estado.numeros[-i:]))
		estadoder.numeros = estado.numeros[:-i]
		estadoder.pasarTurno()		
		estadoder = jugarRecursivo(estadoder)
		estadoizq.cambiarJugadorActual(miJugador)
		diffizq = estadoizq.getPuntos() - estadoizq.getPuntosOtro() #estadoizqSig.getPuntos()
		#
		estadoder.cambiarJugadorActual(miJugador)
		diffder = estadoder.getPuntos() - estadoder.getPuntosOtro() #estadoderSig.getPuntos()
		#
		if maxdiff == None or maxdiff < diffizq or maxdiff < diffder :
			if diffizq > diffder : 
				maxi = i 
				maxdiff = diffizq
				maxdiffestado = estadoizq
			else:
				maxi = -i
				maxdiff = diffder
				maxdiffestado = estadoder
	
	print "sale	 %s %s %s" % (length,maxi,str(estado.numeros))
	maxdiffestado.printEstado()
	return maxdiffestado


#s = JuegoEstado([ -3, -2, -1, 2, 1, 0, -2, -5, -2])
s = JuegoEstado([ -3, -2, -1, 2, 0, -1, -4, -2])
s.printEstado()
jugarRecursivo(s)
